package com.example.twotwo_project;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.EditText;

public class Board_DB extends SQLiteOpenHelper {
	
	Context context;
	// 데이터베이스를 관리해주는 DB객체
	SQLiteDatabase db;
	// DB 이름
	String dbName;
	
	
	// 생성자 생성!
	public Board_DB(Context context, String name, CursorFactory factory,
			int version) { // name = DB이름, version = DB버전
		super(context, name, factory, version);
		
		this.context = context;
		this.dbName = name;
	}

	// 사용자가 사용하려면 데이터베이스가 존재하지 않을 때, 데이터베이스를 만들고 호출한다.
	@Override
	public void onCreate(SQLiteDatabase db) {
		this.db = db;
		
		// note 테이블이 없을때, note 테이블을 만들려고 강제로 작성한 경우이다.
		String sql = "create table if not exists note(_id integer primary key autoincrement, mdate date, subject text, content text )";
		
		// DB 생성
		db.execSQL(sql); // 에뮬레이터의 경우, data/data/databse 경로에서 볼 수 있음
		
		// sample data
		for(int i=1; i<100; i++){
			sql = "insert into note(mdate, subject, content) values(datetime('now'), ?, ? )";  // datatime('now') 로 하면  sysdate 처럼 현재의 시간이 입력이 된다.
			String[] params = { "운동합시다!! " + i + "몇 명 시작", "운동 시작한지" + i + " 일째" }; // 첫번째 배열값('subject' + i)이 위의 values의 처음 물음표에 들어간다. 두번째는 두번째에~
			
			db.execSQL(sql, params);	
		}
	}

	// 사용자가 사용하려는 데이터베이스가 존재할 때, 데이터베이스를 가져온다.
	@Override
	public void onOpen(SQLiteDatabase db) {
		
		super.onOpen(db);
		this.db = db;
	}

	
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
		
	}
	
	
	public ArrayList<HashMap<String, String>> select(EditText key){
		
		String keys = key.getText().toString();
		ArrayList<HashMap<String, String>> al = new ArrayList<HashMap<String, String>>();
		
		String sql = "select _id, mdate, subject from note where subject like ? or content like ? order by mdate desc";  // 날짜순으로 noteDB를 불러들인다.
		// Cursor는 오라클에서 resultSet 역할을 한다. rawQuery 는 오라클에서 ExcuteQuery 역할
		String[] params = {"%" + keys +"%", "%" + keys +"%"};
		Cursor c = db.rawQuery(sql, params);
		
		while(c.moveToNext()){
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("_id", "" + c.getInt(0));     // 데이터가 담긴 c 값의 첫번째 값을 _id 값에 담아서 al 에 넣음
			map.put("subject", c.getString(2));  // 데이터가 담긴 c 값의 세번째 값을 subject 값에 담아서 al 에 넣음
			al.add(map);
		}
		
		return al;
	}
	
	public Data select(String id){
		Data data = new Data();
		String sql = "select _id, mdate, subject, content from note where _id = ?";
		Cursor c = db.rawQuery(sql, new String[]{id});
		c.moveToNext();
		data._id = c.getInt(0);
		data.mdate = c.getString(1);
		data.subject = c.getString(2);
		data.content = c.getString(3);
		
		return data;
	}
	
	public void delete(String id){
		String sql = "delete from note where _id = ?";
		db.execSQL(sql, new String[]{id});
	}
	
	public boolean update(Data d){
		boolean b = false;
		
		String sql = "update note set subject = ?, content = ? where _id = ?";
		String[] params = { d.subject, d.content, ""  + d._id};
		
		try {
			db.execSQL(sql, params);
			b = true;
		} catch (Exception ex) {
			b = false;
		} finally {
			return b;
		}
	}
	
	public boolean insert(Data d){
		boolean b = false;
		
		String sql = "insert into note(mdate, subject, content) values(datetime('now'), ?, ?)";
		String[] params = {d.subject, d.content};
		
		try {
			db.execSQL(sql, params);
			b = true;
		} catch (Exception ex) {
			b = false;
		}
		
		return b;
	}
}
